home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-9.10-netbook-remix-PL.iso / casper / filesystem.squashfs / usr / lib / python2.6 / multiprocessing / heap.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2009-11-11  |  6KB  |  206 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import bisect
  5. import mmap
  6. import tempfile
  7. import os
  8. import sys
  9. import threading
  10. import itertools
  11. import _multiprocessing
  12. from multiprocessing.util import Finalize, info
  13. from multiprocessing.forking import assert_spawning
  14. __all__ = [
  15.     'BufferWrapper']
  16. if sys.platform == 'win32':
  17.     from _multiprocessing import win32
  18.     
  19.     class Arena(object):
  20.         _counter = itertools.count()
  21.         
  22.         def __init__(self, size):
  23.             self.size = size
  24.             self.name = 'pym-%d-%d' % (os.getpid(), Arena._counter.next())
  25.             self.buffer = mmap.mmap(-1, self.size, tagname = self.name)
  26.             if not win32.GetLastError() == 0:
  27.                 raise AssertionError, 'tagname already in use'
  28.             self._state = (self.size, self.name)
  29.  
  30.         
  31.         def __getstate__(self):
  32.             assert_spawning(self)
  33.             return self._state
  34.  
  35.         
  36.         def __setstate__(self, state):
  37.             (self.size, self.name) = self._state = state
  38.             self.buffer = mmap.mmap(-1, self.size, tagname = self.name)
  39.             if not win32.GetLastError() == win32.ERROR_ALREADY_EXISTS:
  40.                 raise AssertionError
  41.  
  42.  
  43. else:
  44.     
  45.     class Arena(object):
  46.         
  47.         def __init__(self, size):
  48.             self.buffer = mmap.mmap(-1, size)
  49.             self.size = size
  50.             self.name = None
  51.  
  52.  
  53.  
  54. class Heap(object):
  55.     _alignment = 8
  56.     
  57.     def __init__(self, size = mmap.PAGESIZE):
  58.         self._lastpid = os.getpid()
  59.         self._lock = threading.Lock()
  60.         self._size = size
  61.         self._lengths = []
  62.         self._len_to_seq = { }
  63.         self._start_to_block = { }
  64.         self._stop_to_block = { }
  65.         self._allocated_blocks = set()
  66.         self._arenas = []
  67.  
  68.     
  69.     def _roundup(n, alignment):
  70.         mask = alignment - 1
  71.         return n + mask & ~mask
  72.  
  73.     _roundup = staticmethod(_roundup)
  74.     
  75.     def _malloc(self, size):
  76.         i = bisect.bisect_left(self._lengths, size)
  77.         if i == len(self._lengths):
  78.             length = self._roundup(max(self._size, size), mmap.PAGESIZE)
  79.             self._size *= 2
  80.             info('allocating a new mmap of length %d', length)
  81.             arena = Arena(length)
  82.             self._arenas.append(arena)
  83.             return (arena, 0, length)
  84.         length = self._lengths[i]
  85.         seq = self._len_to_seq[length]
  86.         block = seq.pop()
  87.         if not seq:
  88.             del self._len_to_seq[length]
  89.             del self._lengths[i]
  90.         
  91.         (arena, start, stop) = block
  92.         del self._start_to_block[(arena, start)]
  93.         del self._stop_to_block[(arena, stop)]
  94.         return block
  95.  
  96.     
  97.     def _free(self, block):
  98.         (arena, start, stop) = block
  99.         
  100.         try:
  101.             prev_block = self._stop_to_block[(arena, start)]
  102.         except KeyError:
  103.             pass
  104.  
  105.         (start, _) = self._absorb(prev_block)
  106.         
  107.         try:
  108.             next_block = self._start_to_block[(arena, stop)]
  109.         except KeyError:
  110.             pass
  111.  
  112.         (_, stop) = self._absorb(next_block)
  113.         block = (arena, start, stop)
  114.         length = stop - start
  115.         
  116.         try:
  117.             self._len_to_seq[length].append(block)
  118.         except KeyError:
  119.             self._len_to_seq[length] = [
  120.                 block]
  121.             bisect.insort(self._lengths, length)
  122.  
  123.         self._start_to_block[(arena, start)] = block
  124.         self._stop_to_block[(arena, stop)] = block
  125.  
  126.     
  127.     def _absorb(self, block):
  128.         (arena, start, stop) = block
  129.         del self._start_to_block[(arena, start)]
  130.         del self._stop_to_block[(arena, stop)]
  131.         length = stop - start
  132.         seq = self._len_to_seq[length]
  133.         seq.remove(block)
  134.         if not seq:
  135.             del self._len_to_seq[length]
  136.             self._lengths.remove(length)
  137.         
  138.         return (start, stop)
  139.  
  140.     
  141.     def free(self, block):
  142.         if not os.getpid() == self._lastpid:
  143.             raise AssertionError
  144.         self._lock.acquire()
  145.         
  146.         try:
  147.             self._allocated_blocks.remove(block)
  148.             self._free(block)
  149.         finally:
  150.             self._lock.release()
  151.  
  152.  
  153.     
  154.     def malloc(self, size):
  155.         if size <= size:
  156.             pass
  157.         elif not size < sys.maxint:
  158.             raise AssertionError
  159.         if os.getpid() != self._lastpid:
  160.             self.__init__()
  161.         
  162.         self._lock.acquire()
  163.         
  164.         try:
  165.             size = self._roundup(max(size, 1), self._alignment)
  166.             (arena, start, stop) = self._malloc(size)
  167.             new_stop = start + size
  168.             if new_stop < stop:
  169.                 self._free((arena, new_stop, stop))
  170.             
  171.             block = (arena, start, new_stop)
  172.             self._allocated_blocks.add(block)
  173.             return block
  174.         finally:
  175.             self._lock.release()
  176.  
  177.  
  178.  
  179.  
  180. class BufferWrapper(object):
  181.     _heap = Heap()
  182.     
  183.     def __init__(self, size):
  184.         if size <= size:
  185.             pass
  186.         elif not size < sys.maxint:
  187.             raise AssertionError
  188.         block = BufferWrapper._heap.malloc(size)
  189.         self._state = (block, size)
  190.         Finalize(self, BufferWrapper._heap.free, args = (block,))
  191.  
  192.     
  193.     def get_address(self):
  194.         (arena, start, stop) = ()
  195.         size = self._state
  196.         (address, length) = _multiprocessing.address_of_buffer(arena.buffer)
  197.         if not size <= length:
  198.             raise AssertionError
  199.         return address + start
  200.  
  201.     
  202.     def get_size(self):
  203.         return self._state[1]
  204.  
  205.  
  206.